class: center, middle, inverse, title-slide # Espace et Temps avec R ## 1 - Manipulation de données spatiales ### Robin Cura, Hélène Mathian & Lise Vaudor ### 16/10/2018
École Thématique GeoViz 2018 --- ## Sommaire .pull-left[ Charger des données spatiales - [Les Simples Features et R](#objets-sf) - [Lecture de fichiers spatiaux](#lecture-sf) - [Conversion de tableaux en sf](#conversion-spatiale) Manipuler des données spatiales - [Éditer des données](#modifier-sf) - [Systèmes de projections](#projections-sf) - [Agrégations spatiales](#agregations-sf) - [Jointures spatiales](#jointures-spatiales) - [Opérations géométriques](#operations-spatiales) - [Quelques exemples d'analyse spatiale avec R](#analyse-spatiale) ] .pull-right[ Exploration visuelle de données spatiales - [Afficher un objet avec plot](#plot-sf) - [Exploration rapide avec mapview](#plot-mapview) - [Exploration thématique avec mapview](#carto-mapview) Cartographier avec R - [Cartographier avec ggplot2](#carto-ggplot2) - [Cartographie statique avec cartography](#carto-cartography) - [Cartographie dynamique avec leaflet](#carto-leaflet) ] --- ## Les données spatiales dans R Deux formats de données spatiales coexistent : - `sp`, le format le plus ancien et répandu - `sf`, un format plus récent, puissant, mais pas encore universel .pull-left[ .smaller[ ```r library(rgdal) library(sp) iris_Paris_sp <- readOGR("data/ParisIris2017.shp", stringsAsFactors = FALSE) ``` ``` ## OGR data source with driver: ESRI Shapefile ## Source: "/data/user/c/rcura/geoviz2018/data/ParisIris2017.shp", layer: "ParisIris2017" ## with 992 features ## It has 77 fields ``` ]  ] .pull-right[ .smaller[ ```r library(sf) iris_Paris_sf <- st_read("data/ParisIris2017.shp", stringsAsFactors = FALSE) ``` ``` ## Reading layer `ParisIris2017' from data source `/data/user/c/rcura/geoviz2018/data/ParisIris2017.shp' using driver `ESRI Shapefile' ## Simple feature collection with 992 features and 77 fields ## geometry type: MULTIPOLYGON ## dimension: XY ## bbox: xmin: 643075.6 ymin: 6857477 xmax: 661086.2 ymax: 6867081 ## epsg (SRID): NA ## proj4string: +proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs ``` ```r str(iris_Paris_sf) ``` ``` ## Classes 'sf' and 'data.frame': 992 obs. of 78 variables: ## $ INSEE : chr "75119" "75117" "75112" "75110" ... ## $ NOM_C : chr "Paris 19e Arrondissement" "Paris 17e Arrondissement" "Paris 12e Arrondissement" "Paris 10e Arrondissement" ... ## $ IRIS : chr "7316" "6716" "4502" "3703" ... ## $ CODE_ : chr "751197316" "751176716" "751124502" "751103703" ... ## $ NOM_I : chr "Villette 16" "Batignolles 16" "Bel Air 2" "Saint-Vincent de Paul 3" ... ## $ TYP_IRIS_x: chr "H" "H" "H" "H" ... ## $ REG : chr "11" "11" "11" "11" ... ## $ REG20 : chr "11" "11" "11" "11" ... ## $ DEP : chr "75" "75" "75" "75" ... ## $ UU201 : chr "00851" "00851" "00851" "00851" ... ## $ COM_x : chr "75119" "75117" "75112" "75110" ... ## $ LIBCOM_x : chr "Paris 19e Arrondissement" "Paris 17e Arrondissement" "Paris 12e Arrondissement" "Paris 10e Arrondissement" ... ## $ TRIRI : chr "752471" "752011" "750921" "750631" ... ## $ GRD_Q : chr "7511973" "7511767" "7511245" "7511037" ... ## $ LIBIRIS_x : chr "Villette 16" "Batignolles 16" "Bel Air 2" "Saint-Vincent de Paul 3" ... ## $ TYP_IRIS_y: chr "H" "H" "H" "H" ... ## $ MODIF : chr "00" "00" "00" "00" ... ## $ LAB_I : chr "1" "2" "1" "1" ... ## $ P12_POP156: num 2773 1608 3299 2073 1828 ... ## $ P12_POP152: num 404 339 473 233 223 ... ## $ P12_POP2 : num 2028 999 2439 1556 1337 ... ## $ P12_POP5 : num 341 270 386 284 268 ... ## $ P12_ACTOCC: num 1896 1044 2442 1634 1269 ... ## $ P12_H : num 1084 504 1148 911 687 ... ## $ P12_F : num 813 541 1293 723 582 ... ## $ P12_CHOM15: num 281 175 297 160 209 ... ## $ P12_CHOM_1: num 40.43 43.69 38.82 8.93 33.91 ... ## $ P12_CHOM2 : num 225 118 234 123 144 ... ## $ P12_CHOM5 : num 14.9 13.9 24.5 28.7 32 ... ## $ P12_E : num 236 208 344 130 122 ... ## $ P12_R : num 132.6 58.5 80.2 40.3 55.8 ... ## $ C12_ACTOCC: num 0 0 0 0 0 ... ## $ C12_ACTO_1: num 63.4 64.3 105.4 78.5 38 ... ## $ C12_ACTO_2: num 692 464 1209 864 493 ... ## $ C12_ACTO_3: num 505 226 647 342 354 ... ## $ C12_ACTO_4: num 469 231 360 245 196 ... ## $ C12_ACTO_5: num 166.9 58.4 120.5 104 187.5 ... ## $ P12_ACTO_1: num 1314 643 1615 947 782 ... ## $ C12_ACTO_6: num 1913 1058 2484 1641 1291 ... ## $ C12_ACTO_7: num 66.5 16.4 53 85.5 51 ... ## $ C12_ACTO_8: num 123 120 149 114 142 ... ## $ C12_ACTO_9: num 127.5 98.2 182 158.8 92.5 ... ## $ C12_ACTO10: num 225.4 209.2 346.4 85.8 59 ... ## $ C12_ACTO11: num 1370 614 1753 1196 946 ... ## $ tCHOM : num 10.12 10.91 9.01 7.74 11.46 ... ## $ tCAD : num 36.5 44.4 49.5 52.9 38.8 ... ## $ tOUV : num 8.8 5.6 4.93 6.37 14.77 ... ## $ tETUD : num 8.51 12.95 10.43 6.26 6.68 ... ## $ tRETR : num 4.78 3.64 2.43 1.94 3.05 ... ## $ tDOUX : num 13.1 20.6 13.3 16.6 18.2 ... ## $ tWAUT : num 6.87 6.08 6.5 5.77 6.06 ... ## $ LIBIRIS_y : chr "Villette 16" "Batignolles 16" "Bel Air 2" "Saint-Vincent de Paul 3" ... ## $ COM_y : chr "75119" "75117" "75112" "75110" ... ## $ LIBCOM_y : chr "Paris 19e Arrondissement" "Paris 17e Arrondissement" "Paris 12e Arrondissement" "Paris 10e Arrondissement" ... ## $ DEC_PI : num 60.5 75.6 78.4 71.1 56.4 ... ## $ DEC_T : num 37 19 13 21.7 44.8 ... ## $ DEC_Q1 : num 8444 16564 19296 13854 7282 ... ## $ DEC_M : num 16054 30936 31750 27316 14246 ... ## $ DEC_Q3 : num 29800 52314 48240 42264 26756 ... ## $ DEC_E : num 1.33 1.156 0.912 1.04 1.367 ... ## $ DEC_D1 : num 3878 6154 10388 6614 3790 ... ## $ DEC_D2 : num 7060 12698 16838 11140 6244 ... ## $ DEC_D3 : num 9856 19820 21646 16234 8574 ... ## $ DEC_D4 : num 13038 25306 26892 21468 10830 ... ## $ DEC_D6 : num 20952 37446 36458 31932 18754 ... ## $ DEC_D7 : num 26428 46076 44150 38812 24124 ... ## $ DEC_D8 : num 32986 57986 52016 46686 29902 ... ## $ DEC_D9 : num 43976 79042 66650 59658 38910 ... ## $ DEC_R : num 11.34 12.84 6.42 9.02 10.27 ... ## $ DEC_S : num 14.57 16.58 8.26 11.19 13.85 ... ## $ DEC_G : num 0.44 0.461 0.373 0.406 0.437 ... ## $ DEC_PT : num 73.1 67.2 67 75 72.8 73 76.1 66 71.4 62.9 ... ## $ DEC_PC : num 4.4 2.8 2.6 3.7 7 4.1 4.4 5 4.2 1.9 ... ## $ DEC_PB : num 3.1 5.7 5.2 5.4 4 6.4 4.3 8.1 5.2 5.9 ... ## $ DEC_PP : num 15.3 17.5 19.3 9.7 13 11.6 11.4 16.2 14.5 20 ... ## $ DEC_PA : num 4.1 6.8 5.9 6.2 3.2 4.9 3.8 4.7 4.7 9.3 ... ## $ note : num 0 0 0 0 0 0 0 0 0 0 ... ## $ geometry :sfc_MULTIPOLYGON of length 992; first list element: List of 1 ## ..$ :List of 1 ## .. ..$ : num [1:23, 1:2] 653994 653996 654014 654036 654052 ... ## ..- attr(*, "class")= chr "XY" "MULTIPOLYGON" "sfg" ## - attr(*, "sf_column")= chr "geometry" ## - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ... ## ..- attr(*, "names")= chr "INSEE" "NOM_C" "IRIS" "CODE_" ... ``` ] ] --- ## Les données spatiales dans R .pull-left[ .smaller[ ```r plot(iris_Paris_sp) ``` <!-- --> ] ] .pull-right[ .smaller[ ```r plot(iris_Paris_sf) ``` ``` ## Warning: plotting the first 10 out of 77 attributes; use max.plot = 77 to ## plot all ``` <!-- --> ] ] --- ## Les données spatiales dans R On va se contenter de mobiliser le *package* `sf`, qui permet une manipulation d'objets simples, semblables à des `data.frame`/`tibbles`. **N.B.** : Pour une très grande majorité d'opérations, `sf` suffit. Il peut toutefois être nécessaire de passer de `sf` à `sp` dès lors qu'on souhaite utiliser des fonctions spatiales avancées, par exemple pour mobiliser des méthodes d'analyse spatiale. --- name: objets-sf ## `sf` : Les *Simples Features* .small[ .center[  R. Lovelace, J. Nowosad & J. Muenchow (2018), Geocomputation with R - https://geocompr.robinlovelace.net/ ] ] --- ## `sf` : Structure d'un objet `sf` .small[ ```r iris_Paris_sf ``` ``` ## Simple feature collection with 992 features and 77 fields ## geometry type: MULTIPOLYGON ## dimension: XY ## bbox: xmin: 643075.6 ymin: 6857477 xmax: 661086.2 ymax: 6867081 ## epsg (SRID): NA ## proj4string: +proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs ## First 10 features: ## INSEE NOM_C IRIS CODE_ NOM_I ## 1 75119 Paris 19e Arrondissement 7316 751197316 Villette 16 ## 2 75117 Paris 17e Arrondissement 6716 751176716 Batignolles 16 ## 3 75112 Paris 12e Arrondissement 4502 751124502 Bel Air 2 ## 4 75110 Paris 10e Arrondissement 3703 751103703 Saint-Vincent de Paul 3 ## 5 75118 Paris 18e Arrondissement 7104 751187104 Goutte d'Or 4 ## 6 75111 Paris 11e Arrondissement 4314 751114314 Roquette 14 ## 7 75110 Paris 10e Arrondissement 3707 751103707 Saint-Vincent de Paul 7 ## 8 75120 Paris 20e Arrondissement 7702 751207702 Belleville 2 ## 9 75113 Paris 13e Arrondissement 5004 751135004 Gare 4 ## 10 75112 Paris 12e Arrondissement 4623 751124623 Picpus 23 ## TYP_IRIS_x REG REG20 DEP UU201 COM_x LIBCOM_x TRIRI ## 1 H 11 11 75 00851 75119 Paris 19e Arrondissement 752471 ## 2 H 11 11 75 00851 75117 Paris 17e Arrondissement 752011 ## 3 H 11 11 75 00851 75112 Paris 12e Arrondissement 750921 ## 4 H 11 11 75 00851 75110 Paris 10e Arrondissement 750631 ## 5 H 11 11 75 00851 75118 Paris 18e Arrondissement 752241 ## 6 H 11 11 75 00851 75111 Paris 11e Arrondissement 750761 ## 7 H 11 11 75 00851 75110 Paris 10e Arrondissement 750521 ## 8 H 11 11 75 00851 75120 Paris 20e Arrondissement 752671 ## 9 H 11 11 75 00851 75113 Paris 13e Arrondissement 751171 ## 10 H 11 11 75 00851 75112 Paris 12e Arrondissement 750871 ## GRD_Q LIBIRIS_x TYP_IRIS_y MODIF LAB_I P12_POP156 ## 1 7511973 Villette 16 H 00 1 2773.295 ## 2 7511767 Batignolles 16 H 00 2 1607.938 ## 3 7511245 Bel Air 2 H 00 1 3298.589 ## 4 7511037 Saint-Vincent de Paul 3 H 00 1 2073.318 ## 5 7511871 Goutte d'Or 4 H 00 1 1827.740 ## 6 7511143 Roquette 14 H 00 1 2119.054 ## 7 7511037 Saint-Vincent de Paul 7 H 00 1 2085.642 ## 8 7512077 Belleville 2 H 00 1 1780.040 ## 9 7511350 Gare 4 H 00 1 1739.101 ## 10 7511246 Picpus 23 H 00 1 1865.209 ## P12_POP152 P12_POP2 P12_POP5 P12_ACTOCC P12_H P12_F P12_CHOM15 ## 1 404.4521 2027.7569 341.0858 1896.457 1083.7457 812.7111 280.5696 ## 2 338.8139 999.1368 269.9877 1044.352 503.5491 540.8025 175.4440 ## 3 473.4836 2439.1922 385.9136 2441.883 1148.4718 1293.4108 297.1307 ## 4 233.0522 1555.8566 284.4094 1633.523 910.8228 722.7003 160.4475 ## 5 222.7835 1336.6843 268.2717 1269.395 687.3160 582.0788 209.4820 ## 6 389.3338 1447.9719 281.7480 1526.154 760.0974 766.0563 161.9844 ## 7 377.6813 1422.0231 285.9375 1490.283 747.8266 742.4568 207.3144 ## 8 259.4667 1275.5381 245.0352 1235.891 630.4199 605.4714 147.2869 ## 9 354.8166 1104.4292 279.8554 1036.464 584.6978 451.7665 179.9070 ## 10 277.0154 1206.6728 381.5210 1367.210 652.3509 714.8594 123.9858 ## P12_CHOM_1 P12_CHOM2 P12_CHOM5 P12_E P12_R C12_ACTOCC C12_ACTO_1 ## 1 40.425938 225.20953 14.93412 235.9517 132.61766 0.000000 63.39443 ## 2 43.685360 117.87005 13.88863 208.2087 58.47932 0.000000 64.31605 ## 3 38.819925 233.80091 24.50988 344.1325 80.24551 0.000000 105.41036 ## 4 8.925659 122.86038 28.66150 129.7217 40.27206 0.000000 78.47497 ## 5 33.905920 143.61932 31.95676 122.1109 55.80667 0.000000 38.04933 ## 6 12.446423 130.51295 19.02498 299.3277 47.46678 3.513227 67.54160 ## 7 35.832210 136.82888 34.65330 210.7619 44.73030 0.000000 40.86331 ## 8 23.632443 109.89147 13.76303 154.5135 59.28937 3.231969 57.44024 ## 9 20.989153 104.94576 53.97211 280.8549 45.97624 0.000000 80.95816 ## 10 22.908062 81.37625 19.70147 221.2409 62.85588 0.000000 32.57002 ## C12_ACTO_2 C12_ACTO_3 C12_ACTO_4 C12_ACTO_5 P12_ACTO_1 C12_ACTO_6 ## 1 692.1611 505.2008 468.8214 166.87903 1313.8921 1912.654 ## 2 463.8673 226.3769 231.3457 58.44561 642.8553 1057.843 ## 3 1209.4031 646.7339 359.8470 120.48810 1615.0298 2484.088 ## 4 864.3108 341.5941 245.1005 104.04269 946.8372 1640.683 ## 5 492.8643 353.7090 195.7436 187.47297 782.1445 1291.014 ## 6 755.7351 396.0447 234.6675 66.65156 1037.8130 1532.225 ## 7 669.1671 377.1301 259.4702 152.71735 1055.6557 1517.680 ## 8 557.3826 335.6482 212.2942 69.89414 949.7408 1255.457 ## 9 177.9081 154.9199 375.8058 246.87242 722.6266 1049.458 ## 10 802.8213 322.2891 153.2436 56.28640 844.1355 1385.112 ## C12_ACTO_7 C12_ACTO_8 C12_ACTO_9 C12_ACTO10 C12_ACTO11 tCHOM ## 1 66.46918 122.95083 127.47485 225.43169 1370.3277 10.116833 ## 2 16.36327 120.10957 98.18835 209.15091 614.0308 10.911117 ## 3 52.99423 149.35665 181.98134 346.44077 1753.3146 9.007811 ## 4 85.48424 114.29604 158.84527 85.78027 1196.2770 7.738684 ## 5 51.02184 142.44412 92.49702 58.96270 946.0881 11.461261 ## 6 90.95426 117.54959 124.79834 156.73198 1042.1912 7.644184 ## 7 63.36619 124.33498 144.26367 96.73023 1088.9854 9.940076 ## 8 105.76548 85.07495 112.08660 112.48858 840.0411 8.274362 ## 9 49.97417 166.91374 23.98760 141.92665 666.6555 10.344828 ## 10 86.85055 61.58143 91.38944 210.48417 934.8065 6.647285 ## tCAD tOUV tETUD tRETR tDOUX tWAUT ## 1 36.49759 8.799516 8.507994 4.781953 13.09310 6.869470 ## 2 44.41677 5.596354 12.948799 3.636913 20.63614 6.077040 ## 3 49.52749 4.934230 10.432719 2.432722 13.33842 6.501501 ## 4 52.91084 6.369221 6.256718 1.942397 16.64803 5.770995 ## 5 38.82672 14.768690 6.680979 3.053317 18.19819 6.058374 ## 6 49.51894 4.367291 14.125536 2.239999 15.81673 6.773240 ## 7 44.90200 10.247537 10.105372 2.144678 17.69797 6.955718 ## 8 45.09965 5.655363 8.680341 3.330788 15.70437 7.564903 ## 9 17.16490 23.818708 16.149425 2.643678 18.19048 6.885714 ## 10 58.71966 4.116879 11.861454 3.369911 11.04393 6.094348 ## LIBIRIS_y COM_y LIBCOM_y DEC_PI ## 1 Villette 16 75119 Paris 19e Arrondissement 60.47088 ## 2 Batignolles 16 75117 Paris 17e Arrondissement 75.61497 ## 3 Bel Air 2 75112 Paris 12e Arrondissement 78.43137 ## 4 Saint-Vincent de Paul 3 75110 Paris 10e Arrondissement 71.11111 ## 5 Goutte d'Or 4 75118 Paris 18e Arrondissement 56.42123 ## 6 Roquette 14 75111 Paris 11e Arrondissement 74.91776 ## 7 Saint-Vincent de Paul 7 75110 Paris 10e Arrondissement 67.28335 ## 8 Belleville 2 75120 Paris 20e Arrondissement 67.02303 ## 9 Gare 4 75113 Paris 13e Arrondissement 43.92523 ## 10 Picpus 23 75112 Paris 12e Arrondissement 80.56911 ## DEC_T DEC_Q1 DEC_M DEC_Q3 DEC_E DEC_D1 DEC_D2 DEC_D3 DEC_D4 ## 1 36.994543 8444 16054 29800 1.3302604 3878 7060 9856 13038 ## 2 18.965071 16564 30936 52314 1.1556116 6154 12698 19820 25306 ## 3 12.965964 19296 31750 48240 0.9116220 10388 16838 21646 26892 ## 4 21.719956 13854 27316 42264 1.0400498 6614 11140 16234 21468 ## 5 44.828966 7282 14246 26756 1.3669802 3790 6244 8574 10830 ## 6 17.839423 15862 29294 42698 0.9160920 7690 13090 18748 24126 ## 7 27.498909 11442 25200 39262 1.1039683 5120 8700 13508 18622 ## 8 22.975441 12990 24346 39594 1.0927462 5656 10972 14576 19612 ## 9 45.612286 8040 12934 19982 0.9233029 5084 6960 8874 10984 ## 10 9.881976 22750 36682 53746 0.8449921 12418 18626 25890 31268 ## DEC_D6 DEC_D7 DEC_D8 DEC_D9 DEC_R DEC_S DEC_G DEC_PT DEC_PC ## 1 20952 26428 32986 43976 11.339866 14.567462 0.4398229 73.1 4.4 ## 2 37446 46076 57986 79042 12.844004 16.583807 0.4605604 67.2 2.8 ## 3 36458 44150 52016 66650 6.416057 8.262839 0.3728312 67.0 2.6 ## 4 31932 38812 46686 59658 9.019958 11.194868 0.4063489 75.0 3.7 ## 5 18754 24124 29902 38910 10.266491 13.850710 0.4368185 72.8 7.0 ## 6 34456 40282 46392 60176 7.825228 10.384954 0.3910920 73.0 4.1 ## 7 29930 35458 43436 54196 10.585156 14.742398 0.4291728 76.1 4.4 ## 8 29528 35676 42770 53010 9.372348 12.254425 0.4165184 66.0 5.0 ## 9 15658 18396 22504 32864 6.464201 8.409825 0.3902224 71.4 4.2 ## 10 42836 49280 59566 77736 6.259945 8.289456 0.3724164 62.9 1.9 ## DEC_PB DEC_PP DEC_PA note geometry ## 1 3.1 15.3 4.1 0 MULTIPOLYGON (((653993.8 68... ## 2 5.7 17.5 6.8 0 MULTIPOLYGON (((649219.2 68... ## 3 5.2 19.3 5.9 0 MULTIPOLYGON (((656284 6859... ## 4 5.4 9.7 6.2 0 MULTIPOLYGON (((652742.1 68... ## 5 4.0 13.0 3.2 0 MULTIPOLYGON (((652588.4 68... ## 6 6.4 11.6 4.9 0 MULTIPOLYGON (((653895 6861... ## 7 4.3 11.4 3.8 0 MULTIPOLYGON (((653191.4 68... ## 8 8.1 16.2 4.7 0 MULTIPOLYGON (((655422.5 68... ## 9 5.2 14.5 4.7 0 MULTIPOLYGON (((653688.8 68... ## 10 5.9 20.0 9.3 0 MULTIPOLYGON (((655612.4 68... ``` ] - `\(\rightarrow\)` Un `data.frame`, doté d'une colonne de `geometry` et d'un **système de coordonnées/projection**. --- name: lecture-sf ## Lecture de fichiers géographiques #### Toutes les fonctions de `sf` s'inspirent de la syntaxe des fonctions `PostGIS` : `st_OPERATION` : - Lecture d'un shapefile .small[ ```r irisParis <- st_read(dsn = "data/ParisIris2017.shp", stringsAsFactors = FALSE) # Comme pour la lecture des data.frame ``` ``` ## Reading layer `ParisIris2017' from data source `/data/user/c/rcura/geoviz2018/data/ParisIris2017.shp' using driver `ESRI Shapefile' ## Simple feature collection with 992 features and 77 fields ## geometry type: MULTIPOLYGON ## dimension: XY ## bbox: xmin: 643075.6 ymin: 6857477 xmax: 661086.2 ymax: 6867081 ## epsg (SRID): NA ## proj4string: +proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs ``` ] --- name: projections-sf ## Projections / transformations #### Comme dans tout SIG, le système de projection (`st_crs`) est récuperé à la lecture d'un objet : .small[ ```r st_crs(irisParis) ``` ``` ## Coordinate Reference System: ## No EPSG code ## proj4string: "+proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m +no_defs" ``` ] Ici, le "code de projection" est bien reconnu, mais le code EPSG n'est pas renseigné. On va le spécifier pour clarifier (même si ce n'est pas utile) : .small[ ```r irisParis <- irisParis %>% st_set_crs(2154) # SRID/EPSG du Lambert 93 ``` ``` ## Warning: st_crs<- : replacing crs does not reproject data; use st_transform ## for that ``` ```r head(irisParis) ``` ``` ## Simple feature collection with 6 features and 77 fields ## geometry type: MULTIPOLYGON ## dimension: XY ## bbox: xmin: 648979.6 ymin: 6859518 xmax: 656589.8 ymax: 6866159 ## epsg (SRID): 2154 ## proj4string: +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ## INSEE NOM_C IRIS CODE_ NOM_I ## 1 75119 Paris 19e Arrondissement 7316 751197316 Villette 16 ## 2 75117 Paris 17e Arrondissement 6716 751176716 Batignolles 16 ## 3 75112 Paris 12e Arrondissement 4502 751124502 Bel Air 2 ## 4 75110 Paris 10e Arrondissement 3703 751103703 Saint-Vincent de Paul 3 ## 5 75118 Paris 18e Arrondissement 7104 751187104 Goutte d'Or 4 ## 6 75111 Paris 11e Arrondissement 4314 751114314 Roquette 14 ## TYP_IRIS_x REG REG20 DEP UU201 COM_x LIBCOM_x TRIRI ## 1 H 11 11 75 00851 75119 Paris 19e Arrondissement 752471 ## 2 H 11 11 75 00851 75117 Paris 17e Arrondissement 752011 ## 3 H 11 11 75 00851 75112 Paris 12e Arrondissement 750921 ## 4 H 11 11 75 00851 75110 Paris 10e Arrondissement 750631 ## 5 H 11 11 75 00851 75118 Paris 18e Arrondissement 752241 ## 6 H 11 11 75 00851 75111 Paris 11e Arrondissement 750761 ## GRD_Q LIBIRIS_x TYP_IRIS_y MODIF LAB_I P12_POP156 ## 1 7511973 Villette 16 H 00 1 2773.295 ## 2 7511767 Batignolles 16 H 00 2 1607.938 ## 3 7511245 Bel Air 2 H 00 1 3298.589 ## 4 7511037 Saint-Vincent de Paul 3 H 00 1 2073.318 ## 5 7511871 Goutte d'Or 4 H 00 1 1827.740 ## 6 7511143 Roquette 14 H 00 1 2119.054 ## P12_POP152 P12_POP2 P12_POP5 P12_ACTOCC P12_H P12_F P12_CHOM15 ## 1 404.4521 2027.7569 341.0858 1896.457 1083.7457 812.7111 280.5696 ## 2 338.8139 999.1368 269.9877 1044.352 503.5491 540.8025 175.4440 ## 3 473.4836 2439.1922 385.9136 2441.883 1148.4718 1293.4108 297.1307 ## 4 233.0522 1555.8566 284.4094 1633.523 910.8228 722.7003 160.4475 ## 5 222.7835 1336.6843 268.2717 1269.395 687.3160 582.0788 209.4820 ## 6 389.3338 1447.9719 281.7480 1526.154 760.0974 766.0563 161.9844 ## P12_CHOM_1 P12_CHOM2 P12_CHOM5 P12_E P12_R C12_ACTOCC C12_ACTO_1 ## 1 40.425938 225.2095 14.93412 235.9517 132.61766 0.000000 63.39443 ## 2 43.685360 117.8700 13.88863 208.2087 58.47932 0.000000 64.31605 ## 3 38.819925 233.8009 24.50988 344.1325 80.24551 0.000000 105.41036 ## 4 8.925659 122.8604 28.66150 129.7217 40.27206 0.000000 78.47497 ## 5 33.905920 143.6193 31.95676 122.1109 55.80667 0.000000 38.04933 ## 6 12.446423 130.5130 19.02498 299.3277 47.46678 3.513227 67.54160 ## C12_ACTO_2 C12_ACTO_3 C12_ACTO_4 C12_ACTO_5 P12_ACTO_1 C12_ACTO_6 ## 1 692.1611 505.2008 468.8214 166.87903 1313.8921 1912.654 ## 2 463.8673 226.3769 231.3457 58.44561 642.8553 1057.843 ## 3 1209.4031 646.7339 359.8470 120.48810 1615.0298 2484.088 ## 4 864.3108 341.5941 245.1005 104.04269 946.8372 1640.683 ## 5 492.8643 353.7090 195.7436 187.47297 782.1445 1291.014 ## 6 755.7351 396.0447 234.6675 66.65156 1037.8130 1532.225 ## C12_ACTO_7 C12_ACTO_8 C12_ACTO_9 C12_ACTO10 C12_ACTO11 tCHOM ## 1 66.46918 122.9508 127.47485 225.43169 1370.3277 10.116833 ## 2 16.36327 120.1096 98.18835 209.15091 614.0308 10.911117 ## 3 52.99423 149.3566 181.98134 346.44077 1753.3146 9.007811 ## 4 85.48424 114.2960 158.84527 85.78027 1196.2770 7.738684 ## 5 51.02184 142.4441 92.49702 58.96270 946.0881 11.461261 ## 6 90.95426 117.5496 124.79834 156.73198 1042.1912 7.644184 ## tCAD tOUV tETUD tRETR tDOUX tWAUT ## 1 36.49759 8.799516 8.507994 4.781953 13.09310 6.869470 ## 2 44.41677 5.596354 12.948799 3.636913 20.63614 6.077040 ## 3 49.52749 4.934230 10.432719 2.432722 13.33842 6.501501 ## 4 52.91084 6.369221 6.256718 1.942397 16.64803 5.770995 ## 5 38.82672 14.768690 6.680979 3.053317 18.19819 6.058374 ## 6 49.51894 4.367291 14.125536 2.239999 15.81673 6.773240 ## LIBIRIS_y COM_y LIBCOM_y DEC_PI DEC_T ## 1 Villette 16 75119 Paris 19e Arrondissement 60.47088 36.99454 ## 2 Batignolles 16 75117 Paris 17e Arrondissement 75.61497 18.96507 ## 3 Bel Air 2 75112 Paris 12e Arrondissement 78.43137 12.96596 ## 4 Saint-Vincent de Paul 3 75110 Paris 10e Arrondissement 71.11111 21.71996 ## 5 Goutte d'Or 4 75118 Paris 18e Arrondissement 56.42123 44.82897 ## 6 Roquette 14 75111 Paris 11e Arrondissement 74.91776 17.83942 ## DEC_Q1 DEC_M DEC_Q3 DEC_E DEC_D1 DEC_D2 DEC_D3 DEC_D4 DEC_D6 DEC_D7 ## 1 8444 16054 29800 1.330260 3878 7060 9856 13038 20952 26428 ## 2 16564 30936 52314 1.155612 6154 12698 19820 25306 37446 46076 ## 3 19296 31750 48240 0.911622 10388 16838 21646 26892 36458 44150 ## 4 13854 27316 42264 1.040050 6614 11140 16234 21468 31932 38812 ## 5 7282 14246 26756 1.366980 3790 6244 8574 10830 18754 24124 ## 6 15862 29294 42698 0.916092 7690 13090 18748 24126 34456 40282 ## DEC_D8 DEC_D9 DEC_R DEC_S DEC_G DEC_PT DEC_PC DEC_PB DEC_PP ## 1 32986 43976 11.339866 14.567462 0.4398229 73.1 4.4 3.1 15.3 ## 2 57986 79042 12.844004 16.583807 0.4605604 67.2 2.8 5.7 17.5 ## 3 52016 66650 6.416057 8.262839 0.3728312 67.0 2.6 5.2 19.3 ## 4 46686 59658 9.019958 11.194868 0.4063489 75.0 3.7 5.4 9.7 ## 5 29902 38910 10.266491 13.850710 0.4368185 72.8 7.0 4.0 13.0 ## 6 46392 60176 7.825228 10.384954 0.3910920 73.0 4.1 6.4 11.6 ## DEC_PA note geometry ## 1 4.1 0 MULTIPOLYGON (((653993.8 68... ## 2 6.8 0 MULTIPOLYGON (((649219.2 68... ## 3 5.9 0 MULTIPOLYGON (((656284 6859... ## 4 6.2 0 MULTIPOLYGON (((652742.1 68... ## 5 3.2 0 MULTIPOLYGON (((652588.4 68... ## 6 4.9 0 MULTIPOLYGON (((653895 6861... ``` ] --- ## Projections / transformations #### On peut re-projeter un objet `sf` avec la fonction `st_transform(SRID/CRS)` : .pull-left[ .small[ ```r irisParis %>% select(geometry) %>% # Lambert 93 plot() ``` <!-- --> ] ] .pull-right[ .small[ ```r GallPeters <- "+proj=cea +lon_0=0 +lat_ts=45 \ +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs" irisParis %>% select(geometry) %>% * st_transform(crs = GallPeters) %>% plot() ``` <!-- --> ] ] --- name: plot-sf ## Visualisation exploratoire : `plot()` On peut utiliser la fonction de base `plot()`, qui affiche alors l'ensemble des attributs du jeu de données : .small[ ```r plot(irisParis) ``` ``` ## Warning: plotting the first 9 out of 77 attributes; use max.plot = 77 to ## plot all ``` <!-- --> ] --- ## Visualisation exploratoire : `plot()` Pour "cartographier" le contenu d'une seule variable : .small[ ```r plot(irisParis["NOM_C"]) ``` <!-- --> ] --- name: plot-mapview ## Visualisation exploratoire : `mapview` Le *package* `mapview` permet de mener rapidement une exploration des données spatiales et attributaires : .small[ ```r library(mapview) # install.packages("mapview") mapview(irisParis) ```
] --- ## Visualisation exploratoire : `mapview` Le *package* `mapview` permet de mener rapidement une exploration des données spatiales et attributaires. On peut aussi spécifier un attribut à observer avec l'instruction `zcol` : .small[ ```r mapview(irisParis, zcol = "NOM_C") ```
] --- name: modifier-sf ## Opérations attributaires Comme l'objet `sf` est fondamentalement un `data.frame`, on peut lui appliquer les manipulations vues hier : filtrage (`filter`), réductions de variables (`select`), renommage de variables (`rename`) et création/modification de variables (`mutate`) : .small[ ```r irisParis %>% * select(INSEE, CODE_) %>% # La sélection de la colonne `geometry` est implicite * mutate(ARRONDISSEMENT = as.numeric(INSEE) - 100) %>% * filter(ARRONDISSEMENT >= 75001, ARRONDISSEMENT <= 75007) %>% mapview(zcol = "ARRONDISSEMENT") ```
] --- name: agregations-sf ## Agrégations Comme avec un `tibble`, on peut réaliser des opérations d'agrégation. La géométrie est alors, elle-aussi, agrégée en conséquence : .small[ ```r arrondissements_Paris <- irisParis %>% group_by(INSEE) %>% summarise() plot(arrondissements_Paris) ``` <!-- --> ] --- ## Jointures attributaires Comme pour tous les `data.frame`, on peut réaliser des jointures attributaires : .smaller[ ```r df_dmr <- readRDS("dans_ma_rue_clean.RDS") joinData <- df_dmr %>% group_by(CODE_POSTAL, ANNEE_DECLARATION) %>% summarise(NbIncidents = n()) %>% ungroup() donnees_incidents <- arrondissements_Paris %>% mutate(CODGEO = as.character(as.numeric(INSEE) - 100)) %>% * left_join(joinData, by = c("CODGEO" = "CODE_POSTAL")) incidents2015 <- filter(donnees_incidents, ANNEE_DECLARATION == 2015) incidents2017 <- filter(donnees_incidents, ANNEE_DECLARATION == 2017) commonBreaks <- joinData %>% filter(ANNEE_DECLARATION %in% c(2015, 2017)) %>% pull(NbIncidents) %>% quantile(probs = seq(from = 0, to = 1, by = 0.1)) ``` .pull-left[ ```r plot(incidents2015[,"NbIncidents"], main = "Incidents 2015", breaks = commonBreaks) ``` <!-- --> ] .pull-right[ ```r plot(incidents2017[,"NbIncidents"], main = "Incidents 2017", breaks = commonBreaks) ``` <!-- --> ] ] --- name: conversion-spatiale ## Conversion en `sf` et jointures spatiales Les objets `sf` sont des objets spatiaux, on peut donc aussi effectuer des jointures spatiales (entre deux objets `sf`) : - Conversion du jeu de données "Dans ma Rue" en objet spatial avec la fonction `st_as_sf` : .small[ ```r dmr_spatial <- df_dmr %>% filter(ANNEE_DECLARATION %in% c(2015, 2017)) %>% * st_as_sf(coords = c("Long", "Lat"), crs = 4326) %>% st_transform(2154) # Pour une opération géométrique, les objets doivent avoir le même SRID ``` ] --- name: jointures-spatiales ## Jointures spatiales - Jointure spatiale pour récuperer les IRIS contenant les points : .small[ ```r dmr_augmente <- dmr_spatial %>% * st_join(irisParis %>% select(INSEE), join = st_within) ``` .pull-left[ ```r dmr_augmente %>% group_by(INSEE, ANNEE_DECLARATION) %>% summarise(NbIncidents = n()) %>% ungroup() %>% head() ``` ] ] .smaller[ .pull-right[ ``` ## Simple feature collection with 6 features and 3 fields ## geometry type: MULTIPOINT ## dimension: XY ## bbox: xmin: 650249.7 ymin: 6861822 xmax: 653644 ymax: 6863729 ## epsg (SRID): 2154 ## proj4string: +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ## # A tibble: 6 x 4 ## INSEE ANNEE_DECLARATION NbIncidents geometry ## <chr> <int> <int> <MULTIPOINT [m]> ## 1 75101 2015 653 (650305.8 6862792, 650334.4 6862783… ## 2 75101 2017 931 (650249.7 6862872, 650305.9 6862792… ## 3 75102 2015 1028 (650926.9 6863572, 650981.8 6863589… ## 4 75102 2017 1492 (650871.4 6863497, 650915.6 6863514… ## 5 75103 2015 2316 (652345.8 6862636, 652346.3 6862627… ## 6 75103 2017 2466 (652343.7 6862637, 652343.9 6862646… ``` ] ] --- ## Opérations spatiales name: operations-spatiales `sf` permet de réaliser la quasi-totalité des opérations attendues d'un SIG, avec des fonctions dédiées reprenant le vocabulaire classique (inspiré par `PostGIS`) : `st_agr`, `st_area`, `st_bbox`, `st_bind_cols`, `st_boundary`, `st_buffer`, `st_cast`, `st_centroid`, `st_combine`, `st_contains`, `st_contains_properly`, `st_convex_hull`, `st_covered_by`, `st_covers`, `st_crop`, `st_crosses`, `st_difference`, `st_disjoint`, `st_distance`, `st_equals`, `st_equals_exact`, `st_graticule`, `st_interpolate_aw`, `st_intersection`, `st_intersects`, `st_is_simple`, `st_is_valid`, `st_is_within_distance`, `st_jitter`, `st_join`, `st_layers`, `st_length`, `st_line_merge`, `st_line_sample`, `st_make_grid`, `st_overlaps`, `st_point_on_surface`, `st_polygonize`, `st_relate`, `st_sample`, `st_segmentize`, `st_simplify`, `st_snap`, `st_sym_difference`, `st_touches`, `st_transform`, `st_triangulate`, `st_union`, `st_viewport`, `st_voronoi`, `st_within`, `st_wrap_dateline`, `st_write`, `st_write_db`, `st_zm`, `write_sf` Voir les exemples illustrées dans les *vignettes* du *package* `sf` : [Manipulating Simple Feature Geometries](https://cran.r-project.org/web/packages/sf/vignettes/sf3.html) et [Manipulating Simple Features](https://cran.r-project.org/web/packages/sf/vignettes/sf4.html) --- ## Opérations spatiales : un exemple de traitement -> On peut chercher à créer une carte des densités d'incidents déclarés par IRIS, potentiellement selon les années : .small[ ```r nbIncidentsIris <- dmr_spatial %>% st_join(irisParis %>% select(INSEE), join = st_within) %>% st_set_geometry(NULL) %>% # On n'a plus besoin que ce soit un objet spatial group_by(INSEE, ANNEE_DECLARATION) %>% * summarise(NbIncidents = n()) %>% ungroup() irisParis_Incidents <- irisParis %>% * mutate(surface = st_area(.)) %>% left_join(nbIncidentsIris, by = "INSEE") densite_incidents <- irisParis_Incidents %>% * mutate(densiteIncidents = NbIncidents / (surface / 1E6)) %>% # Pour avoir une densité / km² select(INSEE, CODE_, ANNEE_DECLARATION, NbIncidents, densiteIncidents) # Les densités sont exprimées avec des "unités", qui complexifient le traitement. # On les enlève donc : densite_incidents <- densite_incidents %>% mutate(densiteIncidents = units::drop_units(densiteIncidents)) ``` ] --- name: carto-mapview ## Cartographie exploratoire : `mapview` .small[ ```r densite2015 <- filter(densite_incidents, ANNEE_DECLARATION == 2015) densite2017 <- filter(densite_incidents, ANNEE_DECLARATION == 2017) map2015 <- mapview(densite2015, zcol = "densiteIncidents", legend = TRUE) map2017 <- mapview(densite2017, zcol = "densiteIncidents", legend = TRUE) latticeView(map2013, map2017, ncol = 2) ``` ] --- ## Cartographie exploratoire : `mapview` .small[
] --- name: carto-ggplot2 ## Cartographie statique : `ggplot2` On peut bien sûr afficher ces éléments avec le *package* `ggplot2`, en faisant appel à la géométrie dédiée aux objets de type `sf` : `geom_sf` .small[ ```r ggplot(densite_incidents) + geom_sf(data = densite_incidents, aes(fill = densiteIncidents), lwd = 0) + * # On est obligé de remettre la couche sf en data facet_wrap(~ANNEE_DECLARATION) + scale_fill_viridis_c(name = "Incidents / Km²") + guides(fill = guide_colourbar(title.position = "top")) + * coord_sf() + # On s'assure que les coordonnées du graphique respectent le CRS theme_minimal() + theme(legend.position = "bottom", legend.key.width = unit(2,"cm")) ``` <!-- --> ] --- ## Cartographie statique : `ggplot2` - Certains *packages* (`ggsn`, `ggmap`) proposent des foncitonnalités permettant d'améliorer le rendu cartographique (échelles graphiques, flèches d'orientations, fonds de cartes...) ; - mais `ggplot` est avant tout un outil de visualisation **générique** : #### - pour créer des cartographies de qualité, mieux vaut se tourner vers des *packages* dédiés : `tmap` (qu'on ne verra pas ici) et `cartography` --- name: carto-cartography ## Cartographie statique : `cartography` #### Exemple d'une carte en symboles proportionnels .small[ ```r library(cartography) # On commence par afficher un fond de carte par(mar=c(0,0,0,0)) plot(st_geometry(arrondissements_Paris), col = "#1F4257", border = "#B6C1C8", bg = "#708694", lwd = 2) # On ajoute des symboles proportionnels pour les incidents propSymbolsLayer(x = densite_incidents %>% filter(ANNEE_DECLARATION == 2017), var = "NbIncidents", col = "#F97B64", inches = 0.1, legend.title.txt = "Nombre de déclarations par IRIS en 2017") # On ajoute les labels des arrondissements labelLayer(x = arrondissements_Paris %>% mutate(CP = as.numeric(INSEE) - 100), txt = "CP", col = "#B6C1C8", bg = "#1F4257", halo = TRUE, overlap = FALSE, show.lines = FALSE) ``` ] --- ## Cartographie statique : `cartography` #### Exemple d'une carte en symboles proportionnels .center[ .small[ <!-- --> ] ] --- name: carto-leaflet ## Cartographie dynamique : `leaflet` #### - Pour créer des cartes "dynamiques", en plus de `mapview` (qui sert surtout à l'exploration de données), on peut utiliser le *package* `leaflet`, qui génère une carte en HTML+JavaScript que l'on pourra placer sur une page web quelconque : .small[ ```r library(leaflet) densite_incidents2017 <- densite_incidents %>% filter(ANNEE_DECLARATION == 2017) %>% st_transform(4326) # Leaflet requiert une couche en WGS84 seuils <- quantile(densite_incidents2017$densiteIncidents, probs = seq(from = 0, to = 1, by = 0.2)) colorPalette <- colorBin("YlOrRd", domain = densite_incidents2017$densiteIncidents, bins = seuils) infosPopup <- sprintf("<strong>%s</strong><br/>%s incidents (%.1f / km²)", densite_incidents2017$CODE_, densite_incidents2017$NbIncidents, densite_incidents2017$densiteIncidents) %>% lapply(htmltools::HTML) leaflet(data = densite_incidents2017) %>% addProviderTiles(providers$CartoDB.DarkMatterNoLabels) %>% addPolygons( fillColor = ~colorPalette(densiteIncidents), fillOpacity = 0.7, color = "white", weight = .5, opacity = 1, dashArray = "3", label = infosPopup) %>% addLegend(pal = colorPalette, values = ~densiteIncidents, opacity = 0.7, title = "Densités d'incidents<br/>[incident/km²]", position = "topright") ``` ] --- ## Cartographie dynamique : `leaflet` #### - Pour créer des cartes "dynamiques", en plus de `mapview` (qui sert surtout à l'exploration de données), on peut utiliser le *package* `leaflet`, qui génère une carte en HTML+JavaScript que l'on pourra placer sur une page web quelconque : .small[
]